from datetime import datetime, timedelta

from my_tools.df_data_utils import is_none_null


def get_future_date(today_date, days=1):
    # 将输入的日期字符串转换为 datetime 对象
    date_object = datetime.strptime(today_date, "%Y-%m-%d")

    # 计算指定天数后的日期
    future_date = date_object + timedelta(days=days)

    # 将未来的日期转换为字符串格式
    future_date_str = future_date.strftime("%Y-%m-%d")

    return future_date_str


def add_hours_to_datetime(datetime_str, n):
    # 将日期时间字符串转换为 datetime 对象
    dt = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S")
    # 添加 n 小时
    dt_after_n_hours = dt + timedelta(hours=n)
    # 将结果转换为字符串并返回
    return dt_after_n_hours.strftime("%Y-%m-%d %H:%M:%S")


def start_time_adjust_time(input_time):
    try:
        # 尝试解析输入的日期时间字符串
        dt = datetime.strptime(input_time, '%Y-%m-%d')
        # 将时间部分改为 "00:00:00"
        dt = dt.replace(hour=0, minute=0, second=0)
        return dt.strftime('%Y-%m-%d %H:%M:%S')
    except ValueError:
        # 解析失败，返回原始输入
        return input_time


def end_time_adjust_time(input_time):
    try:
        # 尝试解析输入的日期时间字符串
        dt = datetime.strptime(input_time, '%Y-%m-%d')
        # 将日期增加一天
        dt += timedelta(days=1)
        # 将时间部分改为 "00:00:00"
        dt = dt.replace(hour=0, minute=0, second=0)
        return dt.strftime('%Y-%m-%d %H:%M:%S')
    except ValueError:
        # 解析失败，返回原始输入
        return input_time


def get_today_date():
    # 获取今天的日期
    today = datetime.today()
    # 格式化日期为指定格式并返回
    return today.strftime("%Y-%m-%d")


def get_date_list(start_time_str=None, end_time_str=None):
    # 如果开始时间为空，返回空列表
    if is_none_null(start_time_str):
        return []

    # 将字符串转换为 datetime 对象
    start_time = datetime.strptime(start_time_str, '%Y-%m-%d %H:%M:%S')
    start_date = start_time.date()

    if not is_none_null(end_time_str):
        end_time = datetime.strptime(end_time_str, '%Y-%m-%d %H:%M:%S')
        end_date = end_time.date()
    else:
        end_date = start_date

    # 如果结束日期小于等于开始日期，返回开始日期
    if end_date <= start_date:
        return [start_date.strftime('%Y-%m-%d')]

    # 生成中间日期的列表
    date_list = []
    current_date = start_date
    while current_date < end_date:
        date_list.append(current_date.strftime('%Y-%m-%d'))
        current_date += timedelta(days=1)

    return date_list


def get_current_time():
    """
    获取当前的日期和时间，格式为 YYYY-MM-DD HH:MM:SS
    """
    now = datetime.now()
    current_time = now.strftime("%Y-%m-%d %H:%M:%S")
    return current_time


def get_datetime_str_from_datetime(my_datetime: datetime):
    """
    获取当前的日期和时间，格式为 YYYY-MM-DD HH:MM:SS
    """
    if is_none_null(my_datetime):
        return ""
    datetime_str = my_datetime.strftime("%Y-%m-%d %H:%M:%S")
    return datetime_str


def get_date_str_from_datetime(my_datetime: datetime):
    """
    获取当前的日期和时间，格式为 YYYY-MM-DD HH:MM:SS
    """
    if is_none_null(my_datetime):
        return ""
    date_str = my_datetime.strftime("%Y-%m-%d")
    return date_str


def convert_date(date_str):
    # 移除日期字符串中的年、月、日字符
    date_str = date_str.replace('年', '').replace('月', '').replace('日', '')

    # 返回转换后的日期字符串
    return date_str


def get_current_datetime():
    now = datetime.now()
    formatted_time = now.strftime("%Y年%m月%d日%H:%M:%S")
    return formatted_time


# 测试函数
# today_date = "2023-04-05 12:35:46"
# tomorrow_date = get_tomorrow_date(today_date)
# print("明天的日期是:", tomorrow_date)

# input_datetime = "2023-04-05 12:35:46"
# days_to_add = 3
# output_datetime = add_days_to_datetime(input_datetime, days_to_add)
# print(output_datetime)  # 输出 2023-04-08 12:35:46
